// 这个文件会帮我们打包 packages 下的模块，最终打包成 js

/**
 * node dev.js 要打包的模块名 -f 要打包的格式  === process.argv.slice(2)
 * 获取命令行参数 通过 process.argv获取 { 参数1: 用哪个命令执行的 node, 参数2: 执行的文件名 }
 * node 中不能直接使用 esm 的模块，所以需要使用 cjs 的模块  「package.json  type设置为 module」
 *
 * node 中的 esm 模块没有 __dirname 和 require 所以需要使用 url 模块来获取当前文件的绝对路径
 * require 函数 是 node 中的一个函数，可以用来加载模块
 * __dirname 是 node 中的一个全局变量，可以用来获取当前文件的目录名
 * __filename 是 node 中的一个全局变量，可以用来获取当前文件的绝对路径
 * resolve 拼接路径
 * 
 *
 * esbuild.context 是 esbuild 的实例，可以用来打包模块
    entryPoints: [entry], // 入口文件
    outfile: resolve(__dirname, `../packages/${target}/dist/${target}.js`), // 输出文件
    bundle: true, // 打包 「将所有文件打包成一个文件 reactivity 依赖 shared 会打包成一个文件」
    platform: "browser", // 平台 「打包后给浏览器使用」
    sourcemap: true, // 源码映射
    format: format, // 格式 「cjs:require,  esm:import,  iife:script」
    globalName: pkg.buildOptions.name, // 全局变量名 「供全局使用，因为iife 是一个闭包」
 */

// 获取命令行参数
import minimist from "minimist";
// 获取当前文件的绝对路径
import { fileURLToPath } from "url";
// dirname 获取当前文件的目录名 resolve 获取绝对路径
import { dirname, resolve } from "path";
// 创建 require 函数
import { createRequire } from "module";
// 打包工具
import esbuild from "esbuild";

const __filename = fileURLToPath(import.meta.url); // 获取当前文件的绝对路径 file=>/user
const __dirname = dirname(__filename); // dirname 获取当前文件的目录名
const require = createRequire(import.meta.url); // 创建 require 函数「根据当前文件的绝对路径创建」

const args = minimist(process.argv.slice(2));
const target = args._[0] || "reactivity"; // 要打包的模块名
const format = args.f || "iife"; // 要打包的格式

// 入口文件 根据 target 获取入口文件 「resolve 拼接路径」
const entry = resolve(__dirname, `../packages/${target}/src/index.js`);
// 获取 package.json 文件
const pkg = require(`../packages/${target}/package.json`);

esbuild
  .context({
    entryPoints: [entry], // 入口文件
    outfile: resolve(__dirname, `../packages/${target}/dist/${target}.js`), // 输出文件
    bundle: true, // 打包 「将所有文件打包成一个文件 reactivity 依赖 shared 会打包成一个文件」
    platform: "browser", // 平台 「打包后给浏览器使用」
    sourcemap: true, // 源码映射
    format: format, // 格式 「cjs:require,  esm:import,  iife:script」
    globalName: pkg.buildOptions.name, // 全局变量名 「供全局使用，因为iife 是一个闭包」
  })
  .then((ctx) => {
    console.log("打包成功");
    return ctx.watch(); // 监听文件变化
  })
  .catch((err) => {
    console.log(err);
  });
